<?php

/**
 * citas actions.
 *
 * @package    toyomotor
 * @subpackage citas
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class citasActions extends sfActions
{
  public function executeMisCitas(sfWebRequest $request)
  {
    //$this->citas = Doctrine_Core::getTable('Cita')
      $citas = Doctrine_Core::getTable('Cita')
      ->createQuery('a')
      //->where('a.status = 1')
      ->andWhere('a.id_usuario = ?', $this->getUser()->getAttribute('id_usuario'))
      ->OrderBy('a.fecha DESC');
      
      $vehiculo_usuarios = Doctrine_Core::getTable('VehiculoUsuario')
      ->createQuery('a')
      ->select('count(a.id_vehiculo_usuario) as total')
      ->Where('a.id_usuario = ?',$this->getUser()->getAttribute('id_usuario'))
      ->execute();
      
      if($vehiculo_usuarios[0]['total'] < 1 ):
          
          $this->getUser()->setFlash('notice', 'Para poder solicitar una Cita, primero debe agregar un auto al sistema.');
          $this->redirect('vehiculo_usuario/new');
          
      endif;
    
      $this->pager = new sfDoctrinePager('Cita','5');
      $this->pager->setQuery($citas);
      $this->pager->setPage($request->getParameter('page', 1));
      $this->pager->init();
    
  }

  public function executeAdminView(sfWebRequest $request)
  {
    $this->citas = Doctrine_Core::getTable('Cita')
      ->createQuery('a')
      ->andWhere('a.id_usuario = ?', $request->getParameter('id_usuario'))
      ->execute();
  }

  public function executeConfirm(sfWebRequest $request)
  {
    $this->id = $request->getParameter('id');

    $this->token = $request->getParameter('token');

    $this->confirmado = Doctrine_Core::getTable('Cita')->confirmar($this->id,$this->token,$this->getUser()->getAttribute('id_usuario'));

    if ($this->confirmado) :
        $cita = Doctrine_Core::getTable('Cita')->find($this->id);
        $servicios = "";
        if ($cita->Servicios) :
           $servicios = "Entre los servicios sugeridos usted escogi&oacute;: <br/>";
           foreach ($cita->Servicios as $serv) :
             $servicios .= $serv->getNombre().'<br/>';
           endforeach;
        endif;

        $mensaje = 'Hola '.$cita->Usuario->getNombre().'<br/> <br/>
                        Su cita de servicio para su veh&iacute;culo
                        <strong>'.$cita->VehiculoUsuario->__toString().'</strong>,
                            para el d&iacute;a '.date('d-m-Y',  strtotime($cita->getFecha())).' a las '.$cita->getHora().' ha sido confirmada<br/> <br/>
                            Usted ha realizado la siguiente observaci&oacute;n: <br/>'.$cita->getDetallesUsuario().'<br/> <br/>
                            '.$servicios.' <br/>
                            Por favor se agradece ser puntual, al llegar su veh&iacute;culo ser&aacute; recibido por un Asesor de Servicio<br/> <br/>
                        Toyo Motor C.A.';

        $cita->enviarEmail('Cita Confirmada '.$cita->VehiculoUsuario->__toString(),'Automotriz TOYOMOTOR - Gestor de Citas',$mensaje,$cita->Usuario->getEmail());

        if ($cita->Vendedor->getEmail()!="") :

                        $mensaje = 'Hola '.$cita->Vendedor->getNombre().'<br/> <br/>
                        El usuario ha confirmado su cita de servicio para el veh&iacute;culo
                        <strong>'.$cita->VehiculoUsuario->__toString().'</strong>,
                            para el d&iacute;a '.date('d-m-Y',  strtotime($cita->getFecha())).' a las '.$cita->getHora().'<br/> <br/>
                            El usuario ha realizado la siguiente observaci&oacute;n: <br/>'.$cita->getDetallesUsuario().'<br/> <br/>
                            '.$servicios.' <br/>
                            Toyo Motor C.A.';

                        $cita->enviarEmail('Cita Confirmada '.$cita->VehiculoUsuario->__toString(),'Automotriz TOYOMOTOR - Gestor de Citas',$mensaje,$cita->Vendedor->getEmail());

                    endif;
    endif;
  }

  public function executeIndex(sfWebRequest $request)
  {
    $this->citas = Doctrine_Core::getTable('Cita')
      ->createQuery('a')
      ->OrderBy('a.fecha DESC')
      ->OrderBy('a.is_aceptado ASC')
      ->execute();
  }

  public function executeShow(sfWebRequest $request)
  {
    $this->cita = Doctrine_Core::getTable('Cita')->find(array($request->getParameter('id_cita')));
    $this->forward404Unless($this->cita);

    if ($this->getUser()->hasCredential('Usuario')) :
        $this->forward404Unless($this->cita->getIdUsuario()==$this->getUser()->getAttribute('id_usuario'), sprintf('No puede ver la cita del usuario '));
    endif;
  }

  public function executeNew(sfWebRequest $request)
  {
    $this->form = new CitaForm();
  }

  public function executeMensajeUsuario(sfWebRequest $request)
  {

  }

  public function executeCitaUsuario(sfWebRequest $request)
  {
     $vehiculob = Doctrine_Core::getTable('VehiculoUsuario')
      ->createQuery('v')    
      ->select('COUNT(v.placa) AS total')
      ->where('v.id_usuario = ?', $this->getUser()->getAttribute('id_usuario'))
      ->execute();
     
     $total = $vehiculob[0]['total'];
     
     if( $total < 1 || $total == null){
         $this->getUser()->setFlash('notice', 'No tiene Ningun vehiculo para agregar una Cita debe primero agregar un Vehiculo al Sistema.');
         $this->redirect('citas/misCitas');
     }
     
     /*Codigo agregado 15/11/2011 a peticion de un cambio del cliente INICIO*/
     //se obtienen todos los vehiculos del usuario para recuperar su kilometraje e ID
     $vehiculokilom = Doctrine_Core::getTable('VehiculoUsuario')
      ->createQuery('vk')    
      ->select('*')
      ->where('vk.id_usuario = ?', $this->getUser()->getAttribute('id_usuario'))
      ->execute();
     //Se crea un arreglo que tendra los id y los kilometros
     $this->kilometrajev = array ();
     foreach($vehiculokilom as $vk){
         $this->kilometrajev[$vk->getIdVehiculoUsuario()] = $vk->getKilometraje();
     }
     
     /*Codigo agregado 15/11/2011 a peticion de un cambio del cliente FINAL*/
      
    $this->form = new CitaForm();
    $this->form->solicitudcita($this->getUser()->getAttribute('id_usuario'));
    
    /* comentado temporalmente, aqui debia ir el ajax
    if ($request->isXmlHttpRequest())
      {
            $numero = $request->getParameter('numero_editable');
        if ('*' == $numero)
        {
          return $this->renderText('Su numero debe tener al menos 10 numeros.');
        }

        //return $this->renderText('Se ha actualizado el telefono de su perfil con el numero: '.$this->numero);
        return $this->renderText('ss'.$numero.'sss');

      }*/
    
  }
  
  /*Funcion que se encarga de recibir el vehiculo revisar que servicios se recomiendan y mostrarselos*/
  public function executeServicios(sfWebRequest $request){
      
      if(!$request->isMethod(sfRequest::POST)){
          
          $this->redirect('citas/citaUsuario');
          
      }
      
      $form = new CitaForm();
      $form->solicitudcita($this->getUser()->getAttribute('id_usuario'));

     /*Codigo agregado 15/11/2011 a peticion de un cambio del cliente INICIO*/
     //se obtienen todos los vehiculos del usuario para recuperar su kilometraje e ID
     $vehiculokilom = Doctrine_Core::getTable('VehiculoUsuario')
      ->createQuery('vk')    
      ->select('*')
      ->where('vk.id_usuario = ?', $this->getUser()->getAttribute('id_usuario'))
      ->execute();
     //Se crea un arreglo que tendra los id y los kilometros
     $this->kilometrajev = array ();
     foreach($vehiculokilom as $vk){
         $this->kilometrajev[$vk->getIdVehiculoUsuario()] = $vk->getKilometraje();
     }
     
     /*Codigo agregado 15/11/2011 a peticion de un cambio del cliente FINAL*/
      //metodo que revisa el form
      $this->solicitandocita($request, $form);
      
      $cita= $request->getParameter('cita');
      
      $this->datoscita = $request->getParameter('cita');
      
      $vehiculo = Doctrine_Core::getTable('VehiculoUsuario')->find($cita['id_vehiculo_usuario']);
      $vehiculo->setKilometraje($cita['kilometraje']);
      $vehiculo->save();

      $intervalomeses = $vehiculo->getAnoModelo()->getAno();
      
      //lista de todos los servicios disponibles para ese tipo de vehiculo y que esten disponibles (status = 1)
      $servicios = Doctrine_Core::getTable('Servicio')
              ->createQuery('s')
              ->select('*')
              ->where('(s.tipo_vehiculo = "'.$vehiculo->getAnoModelo()->getTipoVehiculo().'" OR s.tipo_vehiculo = "Todos") AND s.status = 1')
              ->execute();
      
      //Se crea una variable para saber cuantos servicios disponibles habra
      $numservicios = count($servicios);
      
      //Se crea un arreglo de servicios vacio donde se guardaran los servicios que cumplan con las condiciones
      $serviciosfinal[] = new Servicio();
      
      //Se define un contador
      $c = 0;
      
      //Se obtienen las citas anteriores que el vehiculo ha tenido y se ordenan por fecha descendente es decir la mas reciente primero
      // CUYO ESTATUS SEA 1 y que tengan una fecha de entrega, si esta en null, no se tomara encuetna para evitar errores y por que
      //significa que aun esta activa esta cita.
      
      $citas = Doctrine_Core::getTable('Cita')
              ->createQuery('c')
              ->select('*')
              ->where('c.id_vehiculo_usuario= "'.$cita['id_vehiculo_usuario'].'" AND c.status = "1" AND fecha_entrega IS NOT NULL')
              ->orderBy('c.fecha ASC')
              ->execute();
      
      //Por cada servicio de la lista se buscara aquellos que coincidan con el kilometraje inicial o la ultima cita
      
      foreach($servicios as $servicio){
          
          
          //Se realiza un ciclo para ver si este servicio ya lo tuvo registrado al menos una vez
          
          foreach($citas as $cita){
          
            //Se obtienen los servicios de cada cita.
            foreach ($cita->getServicios() as $serviciocita){
                          
                //Se compara el servicio de la lista de disponibles con el servicio de esta cita
                if($servicio->getIdServicio() == $serviciocita->getIdServicio()){
                   //$x=$cita->getFechaEntrega();
                    //Si es igual quiere decir que este servicio ya lo ha tenido al menos una vez en esta cita y deberia
                    //guardarlo solo si el kilometraje periodico cumple con la regla o si el periodo se ha cumplido.
                    
                    //Al Kilometraje periodico se le divide entre 4
                    $kmsperiodicodiv = round($servicio->getKmsPeriodico()/4);
                    //Se obtiene el residuo de dividir el kilometraje del auto entre el periodico para saber si es un multiplo
                    //de este o si esta cerca.
                    $kmsresiduo = round($vehiculo->getKilometraje() % $servicio->getKmsPeriodico());
                    
                    //residuo de dividir los meses desde la ultima cita con el intervalo de meses @todo revisar parece inecesario solo deberia obtener la fecha del servicio y compararlo con el intervalo de meses +-1 actualmente eliminado
                    //$mesesresiduo = round(($this->meses($cita->getFechaEntrega())) % $servicio->getIntervaloMeses());
                    
                    //Si esta dentro de un rango de +-100 km de un cuarto 1/4 del kilometraje periodico deberia sugerirlo
                    //O si esta dentro del rango de tiempo periodico +-1 meses tambien deberia sugerirlo
                    //if(($kmsresiduo <= ($kmsperiodicodiv + 100) && $kmsresiduo >= ($kmsperiodicodiv - 100)) || ($mesesresiduo <= ($servicio->getIntervaloMeses() + 2) && $mesesresiduo >= ($servicio->getIntervaloMeses() - 2))){
                    if(($kmsresiduo <= ($kmsperiodicodiv + 100) && $kmsresiduo >= ($kmsperiodicodiv - 100)) || ($this->meses($cita->getFechaEntrega()) >= ($servicio->getIntervaloMeses() - 1))){
                                            //$m[$c] = $this->meses($cita->getFechaEntrega());
                        //Se guarda el servicio en el nuevo arreglo y se aumenta el contador
                        $serviciosfinal[$c] = $servicio;
                        $c++;
                        //Se rompe el ciclo, sale 2 bucles arriba y se mueve al siguiente servicio de los disponibles
                        break 2;
                        
                    }else{
                        
                        //Si este servicio ya lo tuvo pero no cumplio con la condicion anterior, 
                        //quiere decir que aun no entra en el periodo por kilometraje ni en el periodo por meses 
                        //asi que sale del ciclo 2 bucles arriba para buscar el siguiente servicio de los disponibles.
                        break 2;
                        
                    }
                    
                }
                //@TODO falta revisar si se debe agregar aqui un else que maneje cuando no sean iguales, en primera instancia pareciera no ser necesario
               
            }
          
          }   
          
      }
      
      //Se agrega un if despues del ciclo para asegurarse que ya todos los servicios disponibles se agregaron
      //comparando $numservicios y $c, si el numero no es igual, hay una posibilidad de que aun queden servicios por agregar
      //el ciclo anterior busca los servicios que ya se habian dado, pero si no habia servicios antes, debe buscarlos...
      
      if(($numservicios) > $c){
          
          //Se verifica si el contador esta en 0, quiere decir que es laprimera vez que viene y no habra servicios guardados
          if($c == 0){
              
              $this->otra = 'No hay servicios anteriores ó la fecha de entrega de la ultima cita es null o No existen servicios recomendados';
              
              foreach($servicios as $servicio0){  
                  
                  //Se toma el kilometraje inicial sugerido y se le suman y restan 300 para tener un rango, luego se pregunta si el kilometraje del auto esta 
                  //dentro de este rango para agregarlo al arreglo y se le suma
                  $kilomass = $servicio0->getKmsInicial() + 300;
                  $kilomenoss = $servicio0->getKmsInicial() - 300;
                  //Si no es igual debo averiguar si lo puedo meter o no revisando el kilometraje inicial
                  if($vehiculo->getKilometraje() >= $kilomenoss ){

                    //Se guarda el servicio en el nuevo arreglo y se aumenta el contador
                    $serviciosfinal[$c] = $servicio0;
                    $c++;

                  }
                  
              }

              
          }else{
              //Si no e sigual a cero quiere decir que al menos hubo un servicio anteriormente y solo debe buscar los servicios que no se han agregado
              
              $this->otra = 'Hubo un servicios anterior';
              
              //Se recorreran de nuevo los servicios disponibles para buscar aquellos que no estan agregados y ver si 
              //cumplen con las condiciones del primer kilometraje, ya que seria la primera vez que se le realiza
              foreach($servicios as $servicio1){

                  foreach($serviciosfinal as $serviciof){

                      //Si el id de ambos servicios (Array de servicios disponibles y array de servicios para mostrar es igual 
                      //quiere decir que ya lo tengo y no debo hacer nada asi que hago un break para revisar el siguiente servicio
                      if($servicio1->getIdServicio() == $serviciof->getIdServicio()){
                          break;
                      }else{

                          //Se toma el kilometraje inicial sugerido y se le suman y restan 300 para tener un rango, luego se pregunta si el kilometraje del auto esta 
                          //dentro de este rango para agregarlo al arreglo y se le suma
                          $kilomas = $servicio1->getKmsInicial() + 300;
                          $kilomenos = $servicio1->getKmsInicial() - 300;
                          //Si no es igual debo averiguar si lo puedo meter o no revisando el kilometraje inicial
                          //if($vehiculo->getKilometraje() >= $kilomenos && $vehiculo->getKilometraje() <= $kilomas ){
                          if($vehiculo->getKilometraje() >= $kilomenos ){
                            //Se guarda el servicio en el nuevo arreglo y se aumenta el contador
                            $serviciosfinal[$c] = $servicio1;
                            $c++;
                            break;

                          }

                      }

                  }


              }
              
          }
              
      }
      
      /*Se pasan al template los objetos para poder mostrarlos*/
      $this->vehiculo = $vehiculo;
      
      //Muestra el tamaño del arreglo de servicios
      //$this->contadorservi = count($serviciosfinal);
      $this->serrr = $serviciosfinal;
      
      /*Se crea un formulario que muestre varios check boxes y tenga los datos relevantes de manera oculta*/
      
      $this->forms = new CitaForm();
      
      $f = $cita['fecha'];
      $fecha = $f['year'].'-'.$f['month'].'-'.$f['day'];
      $this->fechacita = $fecha;
      
      $this->forms->serviciosrecomendados($this->getUser()->getAttribute('id_usuario'),$cita['id_vehiculo_usuario'],$cita['detalles_usuario'],$fecha,$cita['hora'],$serviciosfinal, $vehiculo->getKilometraje() );
      
      if($this->serrr[0]->getNombre() == null || $this->serrr[0]->getNombre() == ''){
          
          $this->forms0 = new CitaForm();
          $this->forms0->noserviciosrecomendados($this->getUser()->getAttribute('id_usuario'),$cita['id_vehiculo_usuario'],$cita['detalles_usuario'],$fecha,$cita['hora'], $vehiculo->getKilometraje() );
          
      }
      
      //$servicios
      
      /*$this->servicioss = $serviciosfinal;
      $this->c = $c;
      $this->numserv = $numservicios;
      $this->kilov = $vehiculo->getKilometraje();
      $this->serviciosd = $servicios;*/
      
      //$this->m = $m;

  }
  
  /*Funcion agregada para obtener la diferencia en meses, desde la fecha de la ultima cita con la fecha actual*/
  
  protected function meses($fechaservicio){
      
        $fecha_actual = date ("Y-m-d");
        // separamos en partes las fechas
        $array_servicio = explode ( "-", $fechaservicio );
        $array_actual = explode ( "-", $fecha_actual );

        $anos =  $array_actual[0] - $array_servicio[0]; // calculamos años
        $meses = $array_actual[1] - $array_servicio[1]; // calculamos meses
        $dias =  $array_actual[2] - $array_servicio[2]; // calculamos días

        //ajuste de posible negativo en $días
        if ($dias < 0)
        {
            --$meses;

            //ahora hay que sumar a $dias los dias que tiene el mes anterior de la fecha actual
            switch ($array_actual[1]) {
                   case 1:     $dias_mes_anterior=31; break;
                   case 2:     $dias_mes_anterior=31; break;
                   case 3: 
                        if ($this->bisiesto($array_actual[0]))
                        {
                            $dias_mes_anterior=29; break;
                        } else {
                            $dias_mes_anterior=28; break;
                        }
                   case 4:     $dias_mes_anterior=31; break;
                   case 5:     $dias_mes_anterior=30; break;
                   case 6:     $dias_mes_anterior=31; break;
                   case 7:     $dias_mes_anterior=30; break;
                   case 8:     $dias_mes_anterior=31; break;
                   case 9:     $dias_mes_anterior=31; break;
                   case 10:     $dias_mes_anterior=30; break;
                   case 11:     $dias_mes_anterior=31; break;
                   case 12:     $dias_mes_anterior=30; break;
            }

            $dias=$dias + $dias_mes_anterior;
        }

        //ajuste de posible negativo en $meses
        if ($meses < 0)
        {
            --$anos;
            $meses=$meses + 12;
        }
        
        return $meses;
      
  }
  
  /*Funcion agregada para manejar los años bisiestos*/
  
  protected function bisiesto($anio_actual){
    $bisiesto=false;
    //probamos si el mes de febrero del año actual tiene 29 días
      if (checkdate(2,29,$anio_actual))
      {
        $bisiesto=true;
    }
    return $bisiesto;
}

    /**
     * Metodo que recibira los servicios seleccionados y evaluara que se haya seleccionado al menos uno
     * Se solicito un cambio y ahora no es necesario que seleccione al menos un servicio... 14/11/2011
     * @author Ing. Roberto Hernández De La Luz
     * @param sfWebRequest $request 
     */
    public function executeGuardarcita(sfWebRequest $request){
        
        $form = new CitaForm();
        
        $cita= $request->getParameter('cita');
        
        //lista de todos los servicios disponibles para ese tipo de vehiculo y que esten disponibles (status = 1)
        $servicios = Doctrine_Core::getTable('Servicio')
              ->createQuery('s')
              ->select('*')
              ->where('s.status = 1')
              ->execute();
        
        $form->serviciosrecomendados($this->getUser()->getAttribute('id_usuario'),$cita['id_vehiculo_usuario'],$cita['detalles_usuario'],$cita['fecha'],$cita['hora'],$servicios, $cita['kilometraje']);
        
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
            //Si es valido debe guardar la nueva cita
            
            
            //Se revisa si esta inicializada la variable es decir si el usuario selecciono algun servicio y por lo tanto
            //se envio en el request, si no selecciono nada no se habra enviado
            if(isset ($cita['servicios'])){
            //Se guarda el arreglo de servicio
            $servios = $cita['servicios'];
            }
            $usuario = Doctrine_Core::getTable('Usuario')->find($cita['id_usuario']);
            $vehiculo = Doctrine_Core::getTable('VehiculoUsuario')->find($cita['id_vehiculo_usuario']);
            //Codigo agregado 14/11/2011 debido a modificacion que solicito el cliente, se actualizara el
            //kilometraje del vehiculo directamente...
            $vehiculo->setKilometraje($cita['kilometraje']);
            $vehiculo->save();
            
            //Se crea la nueva cita
            $citan = new Cita();

            //Se inicializa y localiza correctamente la variable del tiempo
            date_default_timezone_set('America/Caracas');
            
            //Se inicializan los valores que recibe del formulario para la cita
            $citan->setUsuario($usuario);
            $citan->setVehiculoUsuario($vehiculo);
            $citan->setDetallesUsuario($cita['detalles_usuario']);
            $citan->setFecha($cita['fecha']);
            $citan->setHora($cita['hora']);
            $citan->setKilometraje($cita['kilometraje']);
            $citan->setIsPending(true);
            $citan->setCreatedAt(date('Y-m-d H:i:s', time()));
            $citan->save();
            
            //Se revisa si se recupero la variable servicios
            if(isset ($cita['servicios'])){
            $tama = count($servios);
            
            foreach ($servios as $servicio):
                
                $servii = Doctrine_Core::getTable('Servicio')->findByIdServicio($servicio);
                $serviciocita = new ServiciosCita();
                $serviciocita->setCita($citan);
                $serviciocita->setServicio($servii[0]);
                $serviciocita->save();
                
            endforeach;
            }
            
            /* Inicio de codigo agregado Ing. Roberto Hernández De La Luz Fecha: 22/08/11
             * Se cambio este codigo desde Cita.class.php para aca para poder enviar correctamente el correo electronico
             * ya que se estaba originalmente enviando el correo con servicios antes de guardar la cita y por ende los servicios
             */

            /*if ($this->isNew() && !$this->getCreatedAt())
            {*/
            if(isset ($cita['servicios'])){
                $servicios = "";
                    foreach ($citan->getServiciosCita() as $serv) :
                     $servicios .= $serv->getServicio()->getNombre().'<br/>';
                    endforeach;
            }else{
               $servicios = "Usted no selecciono ningun servicio recomendado: <br/>"; 
            }
            

                $mensaje = 'Hola '.$citan->getUsuario()->getNombre().'<br/> <br/>
                    Usted ha solicitado una cita a travez de nuestra pagina web en AUTOMOTRIZ TOYOMOTOR,C.A., los datos son los siguientes:<br/><br/>
                    <strong>Veh&iacute;culo: </strong>'.$citan->getVehiculoUsuario()->__toString().'<br/><br/>
                        <strong>Kilometraje: </strong>'.$citan->getKilometraje().'<br/><br/>
                        <strong>Fecha Solcitada: </strong>'.date('d-m-Y',  strtotime($citan->getFecha())).'<br/><br/>
                        <strong>Hora: </strong>'.$citan->getHora().'<br/><br/>
                        <strong>Servicios Solicitados: </strong><br/><br/>'.$servicios.'<br>
                        <strong>Observaci&oacute;n:: </strong>'.$citan->getDetallesUsuario().'<br/> <br/>
                        Su nueva Cita ha sido guardada, un asesor le estará confirmando vía telefónica y luego vía correo electrónico la disponibilidad de la fecha que solicito en un lapso de 24 horas.<br/> <br/>
                    AUTOMOTRIZ TOYOMOTOR,C.A. RIF: J-29790037-3';
                //@todo verificar esta linea
                //$this->enviarEmail('Solicitud de Cita '.$this->VehiculoUsuario->__toString(),'Toyo Motor - Gestor de Citas',$mensaje,$this->Usuario->getEmail());
            //}
                $titulo = 'Solicitud de Cita: '.$citan->getVehiculoUsuario()->__toString();
                $de = 'Automotriz TOYOMOTOR';
                //$to = 'rhernandez@netosfera.com'; //@todo cambiar por el email del usuario que esta pidiendo la cita
                $to = $citan->getUsuario()->getEmail();
                
                // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
  		->setUsername('toyomotorenvios@gmail.com')
  		->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
                ->setCharset('utf-8')

                //Give the message a subject
                ->setSubject($sub)
//@todo cambiar los remitentes y destinatarios
                //Set the From address with an associative array
                ->setFrom(array('toyomotorenvios@gmail.com' => $from))

                //Set the To addresses with an associative array
                ->setTo(array($to))

                //Give it a body
                ->setBody($mensaje, 'text/html');

            //Send the message
            $result = $mailer->send($message);
            
            /*Fin de codigo agregado*/
            
            $this->getUser()->setFlash('notice', 'Su nueva Cita ha sido guardada, un asesor le estará confirmando vía telefónica y luego vía correo electrónico la disponibilidad de la fecha que solicito en un lapso de 24 horas.');
            $this->redirect('citas/misCitas');
            

        }else{
            
            $this->forms = $form;
            $this->vehiculo = Doctrine_Core::getTable('VehiculoUsuario')->find($cita['id_vehiculo_usuario']);
            $this->fechacita = $cita['fecha'];
            $this->datoscita = $request->getParameter('cita');
            //this->serrr = 
            //Si no es valido deberia mostrar el error 
            
            $this->setTemplate('servicios');
            
        }
    }
    
 /**
     * Metodo que recibira la cita sin servicios recomendados
     * @param sfWebRequest $request 
     */
    public function executeGuardarcitans(sfWebRequest $request){
        
        $form = new CitaForm();
        
        $cita= $request->getParameter('cita');
        
        $form->noserviciosrecomendados($this->getUser()->getAttribute('id_usuario'),$cita['id_vehiculo_usuario'],$cita['detalles_usuario'],$cita['fecha'],$cita['hora'], $cita['kilometraje']);
        
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
            //Si es valido debe guardar la nueva cita
            
            $usuario = Doctrine_Core::getTable('Usuario')->find($cita['id_usuario']);
            $vehiculo = Doctrine_Core::getTable('VehiculoUsuario')->find($cita['id_vehiculo_usuario']);
            //Codigo agregado 14/11/2011 debido a modificacion que solicito el cliente, se actualizara el
            //kilometraje del vehiculo directamente...
            $vehiculo->setKilometraje($cita['kilometraje']);
            $vehiculo->save();
            //Se crea la nueva cita
            $citan = new Cita();

            //Se inicializa y localiza correctamente la variable del tiempo
            date_default_timezone_set('America/Caracas');
            
            //Se inicializan los valores que recibe del formulario para la cita
            $citan->setUsuario($usuario);
            $citan->setVehiculoUsuario($vehiculo);
            $citan->setDetallesUsuario($cita['detalles_usuario']);
            $citan->setFecha($cita['fecha']);
            $citan->setHora($cita['hora']);
            $citan->setKilometraje($cita['kilometraje']);
            $citan->setIsPending(true);
            $citan->setCreatedAt(date('Y-m-d H:i:s', time()));
            $citan->save();
            
            
            /* Inicio de codigo agregado Ing. Roberto Hernández De La Luz Fecha: 22/08/11
             * Se cambio este codigo desde Cita.class.php para aca para poder enviar correctamente el correo electronico
             * ya que se estaba originalmente enviando el correo con servicios antes de guardar la cita y por ende los servicios
             */

            /*if ($this->isNew() && !$this->getCreatedAt())
            {*/

                $servicios = "Nuestro sistema ha determinado que no existen servicios recomendados para su auto en este momento, esto puede ser debido a que aun no cumple con el kilometraje mínimo, o no estamos ofreciendo en este momento servicios para su modelo, sin embargo cuando lleve su vehiculo al taller podremos darle una opinion completa. <br/>";

                $mensaje = 'Hola '.$citan->getUsuario()->getNombre().'<br/> <br/>
                    Usted ha solicitado una cita a travez de nuestra pagina web en AUTOMOTRIZ TOYOMOTOR,C.A., los datos son los siguientes:<br/><br/>
                    <strong>Veh&iacute;culo: </strong>'.$citan->getVehiculoUsuario()->__toString().'<br/><br/>
                        <strong>Kilometraje: </strong>'.$citan->getKilometraje().'<br/><br/>
                        <strong>Fecha Solcitada: </strong>'.date('d-m-Y',  strtotime($citan->getFecha())).'<br/><br/>
                        <strong>Hora: </strong>'.$citan->getHora().'<br/><br/>
                        <strong>Servicios Solicitados: </strong><br/><br/>'.$servicios.'<br>
                        <strong>Observaci&oacute;n:: </strong>'.$citan->getDetallesUsuario().'<br/> <br/>
                        Su nueva Cita ha sido guardada, un asesor le estará confirmando vía telefónica y luego vía correo electrónico la disponibilidad de la fecha que solicito en un lapso de 24 horas.<br/> <br/>
                    AUTOMOTRIZ TOYOMOTOR,C.A. RIF: J-29790037-3';
                //@todo verificar esta linea
                //$this->enviarEmail('Solicitud de Cita '.$this->VehiculoUsuario->__toString(),'Toyo Motor - Gestor de Citas',$mensaje,$this->Usuario->getEmail());
            //}
                $titulo = 'Gestor de Citas-Solicitud de Cita '.$citan->getVehiculoUsuario()->__toString();
                $de = 'Automotriz TOYOMOTOR';
                //$to = 'rhernandez@netosfera.com'; //@todo cambiar por el email del usuario que esta pidiendo la cita
                $to = $citan->getUsuario()->getEmail();
                
                // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
  		->setUsername('toyomotorenvios@gmail.com')
  		->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
                ->setCharset('utf-8')

                //Give the message a subject
                ->setSubject($sub)
//@todo cambiar los remitentes y destinatarios
                //Set the From address with an associative array
                ->setFrom(array('rhernandez@netosfera.com' => $from))

                //Set the To addresses with an associative array
                ->setTo(array($to))

                //Give it a body
                ->setBody($mensaje, 'text/html');

            //Send the message
            $result = $mailer->send($message);
            
            /*Fin de codigo agregado*/
            
            $this->getUser()->setFlash('notice', 'Su nueva Cita ha sido guardada, un asesor le estará confirmando vía telefónica y luego vía correo electrónico la disponibilidad de la fecha que solicito en un lapso de 24 horas.');
            $this->redirect('citas/misCitas');
            

        }else{
            
            $this->forms = $form;
            $this->vehiculo = Doctrine_Core::getTable('VehiculoUsuario')->find($cita['id_vehiculo_usuario']);
            $this->fechacita = $cita['fecha'];
            $this->datoscita = $request->getParameter('cita');
            //Si no es valido deberia mostrar el error 
            
            $this->setTemplate('servicios');
            
        }
    }    

/**
 * Metodo que revisa si se ha seleccionado una fecha valida, si no es asi, 
 * mostrara de nuevo la plantilla de seleccionar fecha y vehiculo con los errores, si esta bien no hara nada.
 * @param sfWebRequest $request
 * @param sfForm $form 
 */
  protected function solicitandocita(sfWebRequest $request, sfForm $form)
  {
   
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if (!$form->isValid())
    {
      $this->form = $form;
      $this->setTemplate('citaUsuario');

    }
  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));

    $this->form = new CitaForm();

    $this->processForm($request, $this->form);

    if ($this->getUser()->hasCredential('Usuario')) :
        $this->setTemplate('citaUsuario');
    else :
        $this->setTemplate('new');
    endif;

    
  }

  public function executeEdit(sfWebRequest $request)
  {
    $this->forward404Unless($cita = Doctrine_Core::getTable('Cita')->find(array($request->getParameter('id_cita'))), sprintf('Object cita does not exist (%s).', $request->getParameter('id_cita')));
    $this->form = new CitaForm($cita);

    if ($this->getUser()->hasCredential('Usuario')) :
        $this->forward404Unless($cita->getIdUsuario()==$this->getUser()->getAttribute('id_usuario'), sprintf('No puede editar la cita del usuario '));
        $this->setTemplate('citaUsuario');
    endif;

    if ($this->getUser()->hasCredential('Asesor')) :
        if ($cita->getIdVendedor()!="") :
            $this->forward404Unless($cita->getIdVendedor()==$this->getUser()->getAttribute('id_usuario'), sprintf('No puede editar la cita del usuario '));
        endif;
    endif;

  }

  public function executeUpdate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($cita = Doctrine_Core::getTable('Cita')->find(array($request->getParameter('id_cita'))), sprintf('Object cita does not exist (%s).', $request->getParameter('id_cita')));
    $this->form = new CitaForm($cita);

    $this->processForm($request, $this->form);

    if ($this->getUser()->hasCredential('Usuario')) :
        $this->setTemplate('citaUsuario');
    else :
        $this->setTemplate('edit');
    endif;

  }

  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();

    $this->forward404Unless($cita = Doctrine_Core::getTable('Cita')->find(array($request->getParameter('id_cita'))), sprintf('Object cita does not exist (%s).', $request->getParameter('id_cita')));
    $cita->delete();

    $this->redirect('citas/index');
  }

  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $cita = $form->save();

      

      if ($request->getParameter('mis_citas'))
      {
	  $this->redirect('citas/mensajeUsuario');
      }

      $this->redirect('citas/edit?id_cita='.$cita->getIdCita());
    }
  }
  
  
  /*
   * Metodo creado para recibir la clave de seguridad para buscar la cita junto con el parametro que indica si acepto
   * o no la misma, Verifica que la clave existe en la base de datos, luego verifica que las banderas de estado den 010
   * Si la bandera da 010 y acepto la cita se deberan cambiar las banderas de cita a 100
   * si no quiere decir que ya se habia hecho algo con esta cita y redireccionara al index
   * si el parametro indica que no acepto la cita y paso las verificaciones anteriores, procedera a borrar la cita
   * Autor: Ing. Roberto Hernández De La Luz 
   * Fecha: 30/08/11
   */
  public function executeConfirmacion(sfWebRequest $request){
      
      //Se recuperan los parametros r para respuesta y c para codigo de seguridad
      $r = $request->getParameter('r');
      $c = $request->getParameter('c');
      
      //Busco la cita por su clave de seguridad
      $cita = Doctrine_Core::getTable('Cita')
          ->createQuery('c')
          ->select('*, count(id_cita) as total')
          ->where('c.claveseguridad = "'.$c.'"')
          ->fetchOne();
      
      //Verifico si encontro el registro, es decir si no es nulo
      if($cita['total'] == 0){
          $this->redirect('@homepage');
      }else{
          //Si no es nulo lo encontro, pero debo revisar la bandera de estados para que sea igual a 0101
          if($cita->getEstadogeneral() == "0101"){
              //Si es correcta esta bandera se revisa el parametro de respuesta para borrar o confirmar
              
              switch($r){
                  case 's':
                      //la bandera es correcta, y ha aceptado la cita se cambiaran las banderas de la cita y se salvara.
                      $cita->setIsAceptado(true);
                      $cita->setIsPending(false);
                      $cita->save();
                      $this->mensaje = "Usted ha aceptado la cita, lo estaremos esperando el dia ".date('d-m-Y',  strtotime($cita->getFecha()));
                      $this->mensaje0 = "";
                      break;
                  case 'n':
                      $this->mensaje = "Usted NO acepto la cita, por lo tanto ha sido borrada del sistema";
                      $this->mensaje0 = "Por favor inicie sesion y solicite una nueva cita. ";
                      $servicios = $cita->getServicios();
                      foreach($servicios as $servicio):
                          $servicio->delete();
                      endforeach;
                      $cita->delete();
                      break;
                  default :
                      $this->redirect('@homepage');
                      break;
                      
              }
          }else{
              $this->mensaje = "Esta cita ya ha sido confirmada anteriormente";
          }
          
      }
  }
  
  /*
   * Metodo que recibe un parametro y muestra el formulario.
   * Autor: Ing. Roberto Hernández De La Luz 
   * Fecha: 30/08/11
   */
  public function executeEncuesta(sfWebRequest $request){
      
      //Se recuperan el parametro a
      $a = $request->getParameter('a');
      
      
      //Verifico el valor del parametro enviado
      if($a != 's'){
          $this->redirect('@homepage');
      }else{
          
          $this->form = new EncuestaForm();
          
      }
  }
  
    /*
   * Metodo que recibe el formulario y lo evalua y envia.
   * Autor: Ing. Roberto Hernández De La Luz 
   * Fecha: 20/09/11
   */
  public function executeEnvioencuesta(sfWebRequest $request){
      
    $this->forward404Unless($request->isMethod(sfRequest::POST));

    $this->form = new EncuestaForm();

    $this->procesarEnvio($request, $this->form);

    $this->setTemplate('encuesta');

  }
  
     /*
   * Metodo que recibe el formulario y lo evalua y envia.
   * Autor: Ing. Roberto Hernández De La Luz 
   * Fecha: 22/09/11
   */
  public function executeConfirmaciondeenvio(){
      

  } 
  
  /**
   * Metodo creado para procesar el envio y verificar si es valido o no
   * @author Ing. Roberto Hernández De La Luz
   * @param sfWebRequest $request
   * @param sfForm $form 
   */
    protected function procesarEnvio(sfWebRequest $request, sfForm $form)
  {
       $captcha = array(
          'recaptcha_challenge_field' => $request->getParameter('recaptcha_challenge_field'),
          'recaptcha_response_field'  => $request->getParameter('recaptcha_response_field'),
        );
       
       $respuestas = $request->getParameter('encuesta');
       
        $form->bind(array_merge($request->getParameter('encuesta'), array('captcha' => $captcha)));
 
        
    //$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      /*Se realiza el envio del email*/

            $mensaje = 'Se ha respondido una encuesta y estas son las respuestas enviadas: <br/><br/>
                Nombre del cliente: '.$respuestas['nombrec'].'<br/>
                Fecha: '.$respuestas['fecha']['day'].'-'.$respuestas['fecha']['month'].'-'.$respuestas['fecha']['year'].'<br/>
                Placa del vehículo: '.$respuestas['placa'].'<br/>
                Lo atendieron a la hora de su cita: '; 
                $respuestas['atencionhora'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Estuvo satisfecho con la atención y cortesía del Asesor de Servicio: ';
                $respuestas['atencioncortesia'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Fue reparado correctamente su vehículo la primera vez: ';
                $respuestas['reparado'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Fue entregado en el tiempo prometido: ';
                $respuestas['entregatiempo'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Este tiempo prmetido le pareció razonable: ';
                $respuestas['tiemporazonable'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Le mostraron los repuestos reemplazados: ';
                $respuestas['repuestos'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='El costo de los Repuestos y Mano de Obra fue razonable: ';
                $respuestas['costos'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='El Asesor lo mantuvo informado del estado de su vehículo: ';
                $respuestas['asesorinfo'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Le parece accesible nuestra ruta: ';
                $respuestas['ruta'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Podemos contar con su opinión en otra ocasión y contactarlo vía correo electrónico: ';
                $respuestas['ocasion'] == 1 ? $mensaje.='Si<br/>' : $mensaje.='No<br/>';
                $mensaje.='Email: '.$respuestas['email'].'<br/>
                Comentario: '.$respuestas['comentario'].'<br/>';

            
            $titulo = 'Encuesta de Servicio';
            $de = 'Automotriz TOYOMOTOR';
            $to = 'relacionesconclientes@toyomotor.com';

            // send an email to the affiliate
            $transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
            ->setUsername('toyomotorenvios@gmail.com')
            ->setPassword('QOIzYaaab');

            $sub = utf8_encode($titulo);
            $from = utf8_encode($de);

            $mailer = Swift_Mailer::newInstance($transport);

            $message = Swift_Message::newInstance()
            ->setCharset('utf-8')

            //Give the message a subject
            ->setSubject($sub)
            //@todo cambiar los remitentes y destinatarios
            //Set the From address with an associative array
            ->setFrom(array('info@toyomotor.com.ve' => $from))

            //Set the To addresses with an associative array
            ->setTo(array($to))

            //Give it a body
            ->setBody($mensaje, 'text/html');
                
            //Si es diferente de null quiere decir que aun nadie la ha tomado se procede a enviar el email y guardar los cambios
            //Send the message
            //result tendra un entero si es 0 es que fallo
            $result = $mailer->send($message);
            if($result == 0){
                
                $this->getUser()->setFlash('notice', 'Sus respuestas no fueron enviadas debido a un problema, por favor intente de nuevo.');
                $this->redirect('citas/confirmaciondeenvio');
                                
            }else{                                
                $this->getUser()->setFlash('notice', 'Sus respuestas han sido enviadas correctamente.');
                $this->redirect('citas/confirmaciondeenvio');
                
            }
    }
  }
  
}
